#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;

void PrintPending(sigset_t& mypending){
    for(int i = 31; i >= 1; --i){
        int ret = sigismember(&mypending, i);
        cout << ret;
    }
    cout << endl;
}


void My_Handler(int sig){
    cout << "#####################" << endl;
    cout << "向进程" << getpid() << "发送了" << sig << "号信号" << endl;
    sigset_t newpending;
    sigpending(&newpending);
    PrintPending(newpending);
    cout << "#####################" << endl;
}

int main(){
    
    ///捕捉一下2号信号
    signal(SIGINT, My_Handler);

    sigset_t my_set, old_set;
    sigemptyset(&my_set);// 把当前位图所有比特位置空
    sigemptyset(&old_set);// 把当前位图所有比特位置空

    //屏蔽2号信号
    sigaddset(&my_set, 2);

    //通过my_set设置当前进程mask， 把没有修改过的阻塞表拿出来保存
    sigprocmask(SIG_SETMASK, &my_set, &old_set); 

    int cnt = 0;
    sigset_t mypending;

    while(1){
        sigpending(&mypending);
        PrintPending(mypending);
        sleep(1);
        if(cnt == 10){
            // 把2号信号解除屏蔽
            cout << "解除2号信号屏蔽" << endl;
            sigdelset(&my_set, 2);
            sigprocmask(SIG_SETMASK, &my_set, nullptr);

            cout << "重新屏蔽2号信号!" << endl;
            sigaddset(&my_set, 2);
            sigprocmask(SIG_SETMASK, &my_set, nullptr);
            cnt = 0;
        }
        ++cnt;
    }

    return 0;
}
